import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

import { VersioningType } from '@nestjs/common';

import * as session from 'express-session';
import { NextFunction, Request, Response } from 'express';

// 引入 cors 解决跨域
import * as cors from 'cors';

// 配置静态资源路径
import { join } from 'path';
import { NestExpressApplication } from '@nestjs/platform-express';

// 响应拦截器
import { ResIntercept } from './common/resIntercept';
// 异常拦截器
import { HttpFilter } from './common/filter';

// 注册全局DTO验证管道
import { ValidationPipe } from '@nestjs/common';

// 全局守卫
import { RoleGuard } from './guard/role/role.guard';

// 全局中间件
function globleMiddleWare(req: Request, res: Response, next: NextFunction) {
  if (req.originalUrl) {
    console.log('全局中间件', req.originalUrl);
  }
  next();
}

async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule);
  // 配置静态资源路径
  app.useStaticAssets(join(__dirname, 'images'), {
    prefix: '/images', // 虚拟前缀，斜杠不能省略
  });
  // 使用中间件解决跨域
  app.use(cors());
  // 通过 URL 路径 来进行 API 版本控制
  app.enableVersioning({
    type: VersioningType.URI,
  });
  // 使用 session 来实现权限校验
  app.use(
    session({
      secret: 'reindeer', // 生成服务端session 签名 可以理解为加盐
      name: 'reindeer.session', // 生成客户端cookie 的名字 默认 connect.sid
      rolling: true, // 在每次请求时强行设置 cookie，这将重置 cookie 过期时间(默认:false)
    }),
  );
  // 定义一个方法来使用全局中间件
  app.use(globleMiddleWare);
  // 响应拦截器
  app.useGlobalInterceptors(new ResIntercept());
  // 异常拦截器
  app.useGlobalFilters(new HttpFilter());
  // 注册全局DTO验证管道
  app.useGlobalPipes(new ValidationPipe());
  // 全局守卫
  // app.useGlobalGuards(new RoleGuard());
  await app.listen(process.env.PORT ?? 9000);
}
bootstrap();
